mwan3: fix interface-bound traffic when interface is offline
authorMarcin Jurkowski <[email protected]>
Sat, 2 Sep 2017 22:56:09 +0000 (00:56 +0200)
committerMarcin Jurkowski <[email protected]>
Thu, 14 Sep 2017 08:00:34 +0000 (10:00 +0200)
This is a backport of 66406f9 to LEDE 17.01 and replaces hotfix 282e900.

Signed-off-by: Marcin Jurkowski <[email protected]>
net/mwan3/Makefile
net/mwan3/files/etc/hotplug.d/iface/15-mwan3
net/mwan3/files/lib/mwan3/mwan3.sh
net/mwan3/files/usr/sbin/mwan3

index 5387cd9df5443d68c381d4c551ea611a7690d3a1..b75b71b16d1c00aaa46cbe3978f348abb2f75655 100644 (file)
@@ -8,7 +8,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=mwan3
-PKG_VERSION:=2.0.1
+PKG_VERSION:=2.0.2
 PKG_RELEASE:=1
 PKG_MAINTAINER:=Florian Eckert <[email protected]>
 PKG_LICENSE:=GPLv2
index 0e4c8ee388f1824cb9e76e3c608544f35e569f73..1e9599e958a1b629082bf58591bf0728ec1eff5a 100644 (file)
@@ -47,13 +47,13 @@ case "$ACTION" in
                mwan3_create_iface_rules $INTERFACE $DEVICE
                mwan3_create_iface_iptables $INTERFACE $DEVICE
                mwan3_create_iface_route $INTERFACE $DEVICE
+               mwan3_set_iface_hotplug_state $INTERFACE "online"
                mwan3_track $INTERFACE $DEVICE
                mwan3_set_policies_iptables
                mwan3_set_user_rules
        ;;
        ifdown)
-               mwan3_delete_iface_rules $INTERFACE
-               mwan3_delete_iface_route $INTERFACE
+               mwan3_set_iface_hotplug_state $INTERFACE "offline"
                mwan3_delete_iface_ipset_entries $INTERFACE
                mwan3_set_policies_iptables
                mwan3_set_user_rules
index 2bba6f9a32a678f1f2ea8e8926d5caec0da65b75..f7baccd3e1a1a41b8e0c1673f9585726a24f8211 100644 (file)
@@ -7,6 +7,10 @@ IPT4="/usr/sbin/iptables -t mangle -w"
 IPT6="/usr/sbin/ip6tables -t mangle -w"
 LOG="/usr/bin/logger -t mwan3 -p"
 
+MWAN3_STATUS_DIR="/var/run/mwan3"
+
+[ -d $MWAN3_STATUS_DIR ] || mkdir -p $MWAN3_STATUS_DIR/iface_state
+
 mwan3_lock() {
        lock /var/run/mwan3.lock
 }
@@ -415,7 +419,7 @@ mwan3_set_policy()
 
        if [ "$family" == "ipv4" ]; then
 
-               if [ -n "$($IP4 route list table $id)" ]; then
+               if [ "$(mwan3_get_iface_hotplug_state $iface)" = "online" ]; then
                        if [ "$metric" -lt "$lowest_metric_v4" ]; then
 
                                total_weight_v4=$weight
@@ -448,7 +452,7 @@ mwan3_set_policy()
 
        if [ "$family" == "ipv6" ]; then
 
-               if [ -n "$($IP6 route list table $id)" ]; then
+               if [ "$(mwan3_get_iface_hotplug_state $iface)" = "online" ]; then
                        if [ "$metric" -lt "$lowest_metric_v6" ]; then
 
                                total_weight_v6=$weight
@@ -679,6 +683,19 @@ mwan3_set_user_rules()
        config_foreach mwan3_set_user_iptables_rule rule
 }
 
+mwan3_set_iface_hotplug_state() {
+       local iface=$1
+       local state=$2
+
+       echo -n $state > $MWAN3_STATUS_DIR/iface_state/$iface
+}
+
+mwan3_get_iface_hotplug_state() {
+       local iface=$1
+
+       cat $MWAN3_STATUS_DIR/iface_state/$iface 2>/dev/null || echo "unknown"
+}
+
 mwan3_report_iface_status()
 {
        local device result track_ips tracking IP IPT
@@ -700,16 +717,14 @@ mwan3_report_iface_status()
 
        if [ -z "$id" -o -z "$device" ]; then
                result="unknown"
-       elif [ -n "$($IP rule | awk '$1 == "'$(($id+1000)):'"')"i -a -n "$($IP rule | awk '$1 == "'$(($id+2000)):'"')" -a -n "$($IPT -S mwan3_iface_in_$1 2> /dev/null)" -a -n "$($IPT -S mwan3_iface_out_$1 2> /dev/null)" -a -n "$($IP route list table $id default dev $device 2> /dev/null)" ]; then
-               result="online"
+       elif [ -n "$($IP rule | awk '$1 == "'$(($id+1000)):'"')" -a -n "$($IP rule | awk '$1 == "'$(($id+2000)):'"')" -a -n "$($IPT -S mwan3_iface_in_$1 2> /dev/null)" -a -n "$($IPT -S mwan3_iface_out_$1 2> /dev/null)" -a -n "$($IP route list table $id default dev $device 2> /dev/null)" ]; then
+               result="$(mwan3_get_iface_hotplug_state $1)"
        elif [ -n "$($IP rule | awk '$1 == "'$(($id+1000)):'"')" -o -n "$($IP rule | awk '$1 == "'$(($id+2000)):'"')" -o -n "$($IPT -S mwan3_iface_in_$1 2> /dev/null)" -o -n "$($IPT -S mwan3_iface_out_$1 2> /dev/null)" -o -n "$($IP route list table $id default dev $device 2> /dev/null)" ]; then
                result="error"
+       elif [ "$enabled" == "1" ]; then
+               result="offline"
        else
-               if [ "$enabled" == "1" ]; then
-                       result="offline"
-               else
-                       result="disabled"
-               fi
+               result="disabled"
        fi
 
        mwan3_list_track_ips()
index b3285b6f665df532062ee5ddc6d693b612688cac..3355a0f07a2b3dd067a960dd9824ebf5d13942f0 100755 (executable)
@@ -46,7 +46,6 @@ ifdown()
                kill $(cat /var/run/mwan3track-$1.pid)
                rm /var/run/mwan3track-$1.pid
        fi
-       mwan3_delete_iface_iptables $1
 }
 
 ifup()
@@ -166,6 +165,7 @@ stop()
        done
 
        mwan3_lock_clean
+       rm -rf $MWAN3_STATUS_DIR
 }
 
 restart() {